<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 创建对象
    // 1.字面量  2.内置构造函数 3.工厂模式  4.自定义构造函数
    // 字面量
    // var obj = {
    //     name:"张三"
    // }
    // 内置构造函数
    // var obj = new Object();
    // obj.name = "张三";

    // 工厂模式
    // function Factory(name,age){
    //     var obj = {};
    //     obj.name = name;
    //     obj.age = age;
    //     return obj;
    // }
    // var obj = Factory("张三",20);

    // 自定义构造函数
    function Person (name, age) {
      this.name = name;
      this.age = age;
      return {
        name: "123"
      }
    }

    Person.prototype.fn = function () {
      console.log("fn...");
    }

    // var res = new Person("张三",40);
    // console.log(res);

    // 1.创建一个空对象
    // 2.this指向这个空对象
    // 3.对象的原型执行函数的原型
    // 4.隐式返还这个对象 ，返还this
    // let zhnangsan = new Person("张三",20);


    /* 
    new关键字的作用
    创建一个空的简单 JavaScript 对象（即{}）；
    为步骤 1 新创建的对象添加属性__proto__，将该属性链接至构造函数的原型对象 ；
    将步骤 1 新创建的对象作为this的上下文 ；
    如果该函数没有返回对象，则返回this。
    */
    function mynew (name, age) {
      var obj = {};
      var res = Person.call(obj, name, age);
      obj.__proto__ = Person.prototype;
      // 如果没有返还，那么就返还this 也就是这个对象 。 如果有返还就返还用户返还的值
      if (typeof res == "undefined") {
        return obj;
      } else {
        return res;
      }
    }
    // console.log(zhnangsan);
    var zhangsan = mynew("张三", 20);
    console.log(zhangsan);
    // zhangsan.fn();


    // Object.create
    // Object.defineProperty
    // Object.defineProperties



  </script>
</body>

</html>